package pe.gob.foncodes.spp.web.controladores.portafolio;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

import org.apache.log4j.Logger;
import org.primefaces.event.SelectEvent;

import pe.gob.foncodes.spp.bs.domain.Indicador;
import pe.gob.foncodes.spp.bs.domain.Meta;
import pe.gob.foncodes.spp.bs.domain.MetaPeriodo;
import pe.gob.foncodes.spp.bs.domain.Parametro;
import pe.gob.foncodes.spp.bs.services.SppServices;

@ManagedBean
@ApplicationScoped
public class ControladorMeta implements Serializable {

	private static final long serialVersionUID = 9181772024128174141L;
	private List<Parametro> estadoMeta;
	
	/* META */
	private Indicador indicador;
	
	private Meta meta;
	private List<Meta> metas;
	
	private MetaPeriodo metaPeriodo;
	private List<MetaPeriodo> metaPeriodos;
	
	private static Logger LOGGER = Logger.getLogger(ControladorMeta.class);

	@ManagedProperty("#{sppServices}")
	private SppServices sppServices;

	public ControladorMeta() {
		this.meta=new Meta();
		this.metaPeriodo= new MetaPeriodo();
		this.metaPeriodos=new ArrayList<MetaPeriodo>();
		this.metas= new ArrayList<Meta>();
		this.indicador=new Indicador();
	}

	@PostConstruct
	public void inicializar() {
		this.estadoMeta = this.sppServices.buscarEstadosGeneralesActivoNoActivo();
		this.indicador=this.sppServices.buscarIndicadorPorId(2L);
		this.metas= this.sppServices.buscarMetasPorIndicador(2L);
	}

	public SppServices getSppServices() {
		return sppServices;
	}

	public void setSppServices(SppServices sppServices) {
		this.sppServices = sppServices;
	}
	
	public void nuevaMeta(){
		System.out.println("Nueva Meta");
		this.meta=new Meta();
		System.out.println(" Fin Nueva Meta");
	}
	
	public void seleccionarMeta(SelectEvent event){
		System.out.print("Seleccionar Meta");
	}
	
	public void guardarMeta(){
		System.out.println("Guardar Meta");
		try {
			listarMetaPeriodos();
			meta.setMetaPeriodos(metaPeriodos);
			meta.setIndicador(indicador);
			this.sppServices.guardarMeta(meta);
			this.metas= this.sppServices.buscarMetasPorIndicador(2L);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("Fin Guardar Meta");
	}
	
	public int diferenciaMeses(Date fechaIni, Date fechaFin){
		Calendar cal = Calendar.getInstance();  
        cal.setTime(fechaFin);
        int mesFin=  cal.get(Calendar.MONTH);       
        int anoFin = cal.get(Calendar.YEAR);       
        cal.setTime(fechaIni);        
        int mesIni =  cal.get(Calendar.MONTH);      
        int anoIni = cal.get(Calendar.YEAR);        
        int dif_meses=(mesFin - mesIni)+((anoFin - anoIni) * (cal.getMaximum(Calendar.MONTH)+1));
		return dif_meses;
	}
	
	public String nombreMes(Calendar cal){
		String mes="";
		if (cal.get(Calendar.MONTH) == Calendar.JANUARY){
			mes="Enero";
		}else if (cal.get(Calendar.MONTH) == Calendar.FEBRUARY){
			mes="Febrero";
		}else if (cal.get(Calendar.MONTH) == Calendar.MARCH){
			mes="Marzo";
		}else if (cal.get(Calendar.MONTH) == Calendar.APRIL){
			mes="Abril";
		}else if (cal.get(Calendar.MONTH) == Calendar.MAY){
			mes="Mayo";
		}else if (cal.get(Calendar.MONTH) == Calendar.JUNE){
			mes="Junio";
		}else if (cal.get(Calendar.MONTH) == Calendar.JULY){
			mes="Julio";
		}else if (cal.get(Calendar.MONTH) == Calendar.AUGUST){
			mes="Agosto";
		}else if (cal.get(Calendar.MONTH) == Calendar.SEPTEMBER){
			mes="Setiembre";
		}else if (cal.get(Calendar.MONTH) == Calendar.OCTOBER){
			mes="Octubre";
		}else if (cal.get(Calendar.MONTH) == Calendar.NOVEMBER){
			mes="Noviembre";
		}else if (cal.get(Calendar.MONTH) == Calendar.DECEMBER){
			mes="Diciembre";
		}
		return mes;
	}

	
	public void listarMetaPeriodos(){
		metaPeriodos= new ArrayList<MetaPeriodo>();
		try {
			int meses=diferenciaMeses(meta.getFecInicio(), meta.getFecFin());
			int periodo=0;
			int numPeriodo=0;
			//Calcula Periodo Anual
			if(indicador.getCodPeriodo()=="001"){
				periodo=meses/12;	
				numPeriodo=12;
			}else if(indicador.getCodPeriodo()=="002"){
				periodo=meses/3;
				numPeriodo=3;
			}else if(indicador.getCodPeriodo()=="003"){
				periodo=meses/4;
				numPeriodo=4;
			}else if(indicador.getCodPeriodo()=="004"){
				periodo=meses/1;
				numPeriodo=1;
			}else if(indicador.getCodPeriodo()=="005"){
				periodo=meses/6;
				numPeriodo=6;
			}
			Calendar cal = Calendar.getInstance();  
			cal.setTime(meta.getFecInicio());
			
			for ( int i = 1; i <= periodo; i ++ ) {
		        cal.add(Calendar.MONTH, numPeriodo);
				String txtPeriodo = cal.get(Calendar.YEAR) + "." + nombreMes(cal);
				metaPeriodo= new MetaPeriodo();
				metaPeriodo.setMeta(meta);
				metaPeriodo.setTxtPeriodo(txtPeriodo);
				metaPeriodo.setPorMeta(0L);
				metaPeriodo.setPorNegativo(0L);
				metaPeriodo.setPorPositivo(0L);
				metaPeriodo.setPorRealMeta(0L);
			}
			metaPeriodos.add(metaPeriodo);
		} catch (Exception e) {
			e.getStackTrace();
		}
	}
	

	public Meta getMeta() {
		return meta;
	}

	public void setMeta(Meta meta) {
		this.meta = meta;
	}

	public List<Meta> getMetas() {
		if(metas==null)
			metas= this.sppServices.buscarMetasPorIndicador(2L);
		return metas;
	}

	public void setMetas(List<Meta> metas) {
		this.metas = metas;
	}

	public Indicador getIndicador() {
		return indicador;
	}

	public void setIndicador(Indicador indicador) {
		this.indicador = indicador;
	}

	public MetaPeriodo getMetaPeriodo() {
		return metaPeriodo;
	}

	public void setMetaPeriodo(MetaPeriodo metaPeriodo) {
		this.metaPeriodo = metaPeriodo;
	}

	public List<Parametro> getEstadoMeta() {
		return estadoMeta;
	}

	public void setEstadoMeta(List<Parametro> estadoMeta) {
		this.estadoMeta = estadoMeta;
	}
	
	public List<MetaPeriodo> getMetaPeriodos() {
		return metaPeriodos;
	}

	public void setMetaPeriodos(List<MetaPeriodo> metaPeriodos) {
		this.metaPeriodos = metaPeriodos;
	}
		
}
